/*
 * Copyright 2020 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

#[derive(Debug, Eq, PartialEq, thiserror::Error)]
#[error("{field} has invalid value{clarification}{examples}",
    clarification = clarification
                    .as_ref()
                    .map(|v| format!(": {}", v))
                    .unwrap_or_default(),
    examples = examples
                    .as_ref()
                    .map(|v| format!(": {}", v.join(", ")))
                    .unwrap_or_default(),

    )]
pub struct ValueInvalidArgs {
    pub field: String,
    pub clarification: Option<String>,
    pub examples: Option<Vec<String>>,
}

/// Validation failure for a Config
#[derive(Debug, thiserror::Error)]
pub enum ValidationError {
    #[error("field {0} is not unique")]
    NotUnique(String),
    #[error("field {0} cannot be empty")]
    EmptyList(String),
    #[error(transparent)]
    ValueInvalid(#[from] ValueInvalidArgs),
    #[error(transparent)]
    FilterInvalid(#[from] crate::filters::CreationError),
}
